/**
 * Created by 孙淼 on 2023/3/17 20:39
 */
#include "function.h"

//队列初始化，使用的是带头结点的链表来实现
void InitQueue(LinkQueue &Q)
{
    Q.front=Q.rear=(LinkNode*)malloc(sizeof(LinkNode));
    Q.front->next=NULL;  //头结点的next指针为NULL
}
//判断队列是否为空
bool IsEmpty(LinkQueue Q)
{
    if(Q.front==Q.rear)
    {
        return true;
    } else{
        return false;
    }
}
//入队
void EnQueue(LinkQueue &Q,ElemType x)
{
    LinkNode *pnew=(LinkNode*)malloc(sizeof(LinkNode));
    pnew->data=x;
    pnew->next=NULL;    //要让next为NULL，这样才知道尾节点在哪结束
    Q.rear->next=pnew;  //尾指针的next要指向pnew，因为从尾部入队
    Q.rear=pnew;  //rear要指向新的尾部
}
//出队
bool DeQueue(LinkQueue &Q,ElemType &x)
{
    if(Q.front==Q.rear)
    {
        return false;
    }
    LinkNode *q=Q.front->next;
    x=q->data;    //获取要出队的元素值
    Q.front->next=q->next;  //让结点断链
    if(Q.rear==q)           //链表只剩下一个结点时，被删除后要改变rear
    {
        Q.rear=Q.front;
    }
    free(q);
    return true;
}
